home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / stdwin / Gen / wtextbreak.c < prev   
Text File  |  1995-12-21  |  2KB  |  71 lines

  1. /* STDWIN -- TEXT BREAK ROUTINE. */
  2.  
  3. #include "stdwin.h"
  4.  
  5. /* Portable version of wtextbreak(); use on systems where such an
  6.    operation is not an available primitive and wtextwidth has a high
  7.    overhead per call.
  8.    This function makes an educated guess and then uses linear
  9.    interpolation to find the exact answer.
  10.    It assumes that the textwidth function is additive (if not, but
  11.    almost, a final adjustment pass could be added). */
  12.  
  13. int
  14. wtextbreak(str, len, width)
  15.     char *str;
  16.     int len;
  17.     int width;
  18. {
  19.     int en= wcharwidth('n');    /* Estimated average char width */
  20.                     /* NB: adapted below in the loop! */
  21.     int max;            /* Maximum answer */
  22.     int min= 0;            /* Minimum answer */
  23.     int wmin= 0;            /* Corresponding string width */
  24.     
  25.     if (len < 0)
  26.         len= strlen(str);
  27.     max= len;
  28.     
  29.     /* Invariants:
  30.        'min' characters fit, 'max+1' characters don't.
  31.        Ergo: we can stop when min == max. */
  32.     
  33.     while (min < max) {
  34.         /* Guess a number of chars beyond min. */
  35.         int guess= (width - wmin)/en;
  36.         int wguess;
  37.         if (guess <= 0)
  38.             guess= 1;
  39.         else if (min+guess > max)
  40.             guess= max-min;
  41.         wguess= wtextwidth(str+min, guess); /* Width increment */
  42.         if (wguess > 0)
  43.             en= (wguess + guess - 1) / guess;
  44.         guess += min;
  45.         wguess += wmin;
  46.         if (wguess > width) {
  47.             max= guess-1;
  48.         }
  49.         else /* wguess <= width */ {
  50.             min= guess;
  51.             wmin= wguess;
  52.         }
  53.     }
  54.  
  55. #ifdef TEXT_NOT_ADDITIVE
  56.     /* Initially, min==max.  See if min should be smaller. */
  57.     while (min > 0 && wtextwidth(str, min) > width) {
  58.         --min;
  59.     }
  60.     if (min == max) {
  61.         /* Previous loop didn't decrease min.
  62.            See if we can increase it... */
  63.         while (max < len && wtextwidth(str, ++max) <= width) {
  64.             ++min;
  65.         }
  66.     }
  67. #endif
  68.     
  69.     return min;
  70. }
  71.